home *** CD-ROM | disk | FTP | other *** search
/ Light ROM 1 / LIGHT-ROM 1 (Amiga Library Services)(1994).iso / ffdisks / d904.lha / CxPak / Source / WClose.s < prev    next >
Text File  |  1993-08-26  |  8KB  |  540 lines

  1. *****
  2. *
  3. *    $VER : WClose 1.00, Pierre-Louis MANGEARD, Feb. 1993
  4. *
  5. *****
  6.  
  7.     OPT    l-,c+,d-,w+,o1+,o2+,o3+,o4+,o5+,o6+,o7+,o10+,o11+,o12+
  8.  
  9.     INCLUDE    CxPak_Include
  10.  
  11.     SECTION        NTRYHUNK,CODE
  12.  
  13.     clr.l    d4
  14.     lea    _BSSBase,a4
  15.     lea    _DataBase,a5
  16.     
  17.     suba.l    a1,a1
  18.     EXEC        FindTask        find us
  19.     movea.l    d0,a2
  20.     move.l    d0,cxp_Task(a4)
  21.     lea    pr_MsgPort(a2),a0
  22.     move.l    a0,cxp_Port(a5)
  23.  
  24.     tst.l    pr_CLI(a2)
  25.     bne.s    end_startup        and run the user prog
  26.  
  27. fromWorkbench
  28.  
  29. ;    move.l    cxp_Port(a5),a0        port deja en ao
  30.     CALL        WaitPort    wait for a message
  31.     move.l    cxp_Port(a5),a0
  32.     CALL        GetMsg        then get it
  33.     move.l    d0,RetMsg_    save it for later reply
  34.  
  35. end_startup
  36.  
  37.     bsr.s    _main            call our program
  38.  
  39.     tst.l    RetMsg_
  40.     beq.s    exitToDOS        if I was a CLI
  41.  
  42.     EXEC        Forbid
  43.     movea.l    RetMsg_,a1
  44.     CALL        ReplyMsg
  45.  
  46. exitToDOS
  47.  
  48.     rts
  49.  
  50. _main
  51.  
  52. *****
  53. *    debut effectif du programme.
  54. *****
  55.  
  56.     lea    cxname(a5),a1
  57.     CALL        OldOpenLibrary
  58.     move.l    d0,_CxBase(a4)
  59.     beq    cxp55
  60.  
  61.     lea    intname(a5),a1
  62.     CALL        OldOpenLibrary
  63.     move.l    d0,_IntuitionBase(a4)
  64.     beq    cxp55
  65.  
  66.     lea    layername(a5),a1
  67.     CALL        OldOpenLibrary
  68.     move.l    d0,_LayerBase(a4)
  69.     beq    cxp55
  70.  
  71.     lea    iconname(a5),a1
  72.     CALL        OldOpenLibrary
  73.     move.l    d0,_IconBase(a4)
  74.     beq    cxp55
  75.  
  76.     lea    dosname(a5),a1
  77.     CALL        OldOpenLibrary
  78.     move.l    d0,_DOSBase(a4)
  79.     beq    cxp55
  80.  
  81.  
  82.     tst.l    RetMsg_
  83.     beq    cxp020
  84.  
  85. * si on vient du workbench, recuperer ToolTypeArray :
  86.  
  87.     movea.l    RetMsg_,a2
  88.     movea.l    sm_ArgList(a2),a2    ArgList sauvegarde provisoire en a2
  89.     beq    cxp020
  90.     move.l    wa_Lock(a2),d1
  91.     DOS        CurrentDir
  92.  
  93.     movea.l    wa_Name(a2),a0        name en a0
  94.     ICON        GetDiskObject
  95.     move.l    d0,cxp_DiskObj(a4)
  96.     beq    cxp020
  97.     movea.l    d0,a2
  98.     movea.l    do_ToolTypes(a2),a2
  99.  
  100.  
  101. * recupere PRIORITY en tooltype :
  102.  
  103.     movea.l    a2,a0
  104.     lea    cxp_ToolType(a5),a1
  105.     CALL        FindToolType
  106.     tst.l    d0
  107.     beq.s    cxp05
  108.  
  109.     movea.l    d0,a0
  110.     clr.w    d2
  111.  
  112. * conversion ascii -> entier du tooltype CX_PRIORITY :
  113.  
  114.     cmpi.b    #'-',(a0)
  115.     bne.s    cxp06
  116.  
  117.     moveq    #1,d2
  118.     addq.l    #BYTE,a0
  119.  
  120. cxp06    moveq    #0,d0
  121.  
  122. cxp07    moveq    #0,d1
  123.     move.b    (a0)+,d1
  124.     beq.s    cxp09
  125.     subi.b    #'0',d1
  126.     add.l    d0,d0
  127.     add.l    d0,d1
  128.     lsl.l    #2,d0
  129.     add.l    d1,d0
  130.     bra.s    cxp07
  131.  
  132. cxp09    tst.w    d2
  133.     beq.s    cxp08
  134.  
  135.     neg.b    d0
  136.  
  137. cxp08    move.b    d0,cxp_Pri(a5)
  138.  
  139.  
  140. * recupere MOUSEBUTTON en tooltype :
  141.  
  142. cxp05    clr.w    d2
  143.  
  144.     movea.l    a2,a0
  145.     lea    cxp_ToolType2(a5),a1
  146.     ICON        FindToolType
  147.     tst.l    d0
  148.     beq.s    cxp01
  149.  
  150.     movea.l    d0,a0
  151.     lea    IX_dumm(a4),a1
  152.     CX        ParseIX
  153.  
  154.     move.w    IX_dumm+ix_Qualifier(a4),d2
  155.     bne.s    cxp02
  156.  
  157. * si on n'a pas de MOUSEBUTTON valide, on met le MOUSEBUTTON par defaut :
  158.  
  159. cxp01    move.w    #IEQUALIFIER_RBUTTON,d2
  160.  
  161.  
  162. * recupere QUALIFIER en tooltype :
  163.  
  164. cxp02    movea.l    a2,a0
  165.     lea    cxp_ToolType1(a5),a1
  166.     ICON        FindToolType
  167.     tst.l    d0
  168.     beq.s    cxp04
  169.     movea.l    d0,a0
  170.     lea    IX_dumm(a4),a1
  171.     CX        ParseIX
  172.  
  173.     tst.w    IX_dumm+ix_Qualifier(a4)
  174.     beq.s    cxp04
  175.     or.w    IX_dumm+ix_Qualifier(a4),d2
  176.  
  177.     bra.s    cxp010
  178.  
  179. * si on n'a pas de QUALIFIER valide, on 'or' avec le QUALIFIER par defaut :
  180.  
  181. cxp04    or.w    #IEQUALIFIER_LCOMMAND,d2
  182.  
  183. * et on sauve le qualifier :
  184.  
  185. cxp010    move.w    d2,cxp_Qual(a5)
  186.  
  187.     movea.l    cxp_DiskObj(a4),a0
  188.     ICON        FreeDiskObject
  189.  
  190.  
  191. * definition du signal :
  192.  
  193. cxp020    clr.l    d0
  194.     movea.l    cxp_Port(a5),a1
  195.     move.b    MP_SIGBIT(a1),d0
  196.     moveq    #1,SigFlg_
  197.     lsl.l    d0,SigFlg_
  198.     ori.l    #SIGBREAKF_CTRL_C,SigFlg_
  199.  
  200. * installation du broker :
  201.  
  202.     lea    cxp_NewBroker(a5),a0
  203.     moveq    #0,d0
  204.     CX        CxBroker
  205.     move.l    d0,Broker_
  206.     beq    cxp55                si WClose deja la
  207.  
  208. * installation du filter :
  209.  
  210.     moveq    #CX_FILTER,d0
  211.     lea    cxp_HotKey(a5),a0
  212.     suba.l    a1,a1
  213.     CALL        CreateCxObj
  214.     move.l    d0,d2
  215.     beq    cxp55
  216.     movea.l    Broker_,a0
  217.     movea.l    d0,a1
  218.     CALL        AttachCxObj
  219.  
  220.     movea.l    d2,a0
  221.     lea    IX(a5),a1
  222.     CALL        SetFilterIX
  223.  
  224. * installation du sender :
  225.  
  226.     moveq    #CX_SEND,d0
  227.     movea.l    cxp_Port(a5),a0
  228.     movea.w    #CX_MAGIC,a1
  229.     CALL        CreateCxObj
  230.     tst.l    d0
  231.     beq    cxp55
  232.     movea.l    d2,a0
  233.     movea.l    d0,a1
  234.     CALL        AttachCxObj
  235.  
  236. * installation du custom :
  237.  
  238.     moveq    #CX_CUSTOM,d0
  239.     lea    cxp_Action(pc),a0
  240.     suba.l    a1,a1
  241.     CALL        CreateCxObj
  242.     tst.l    d0
  243.     beq    cxp55
  244.     movea.l    d2,a0
  245.     movea.l    d0,a1
  246.     CALL        AttachCxObj
  247.  
  248.  
  249. * activation du broker :
  250.  
  251.     moveq    #TRUE,d0
  252.     bsr    SwitchBroker
  253.  
  254.  
  255. * recuperation du message :
  256.  
  257. cxp1    move.l    SigFlg_,d0
  258.     EXEC        Wait
  259.  
  260.     cmpi.l    #SIGBREAKF_CTRL_C,d0
  261.     bne.s    cxp3
  262.  
  263.     moveq    #CXCMD_KILL,MsgId_
  264.  
  265. cxp3    movea.l    cxp_Port(a5),a0
  266.     CALL        GetMsg
  267.     tst.l    d0
  268.     beq    cxp40
  269.     movea.l    d0,a2
  270.  
  271. * type et id du message :
  272.  
  273.     movea.l    a2,a0
  274.     CX        CxMsgType
  275.     move.w    d0,MsgType_
  276.  
  277.     movea.l    a2,a0
  278.     CALL        CxMsgID
  279.     move.w    d0,MsgId_
  280.  
  281.     movea.l    a2,a1
  282.     EXEC    ReplyMsg
  283.  
  284. * action selon le type :
  285.  
  286.     cmpi.w    #CXM_COMMAND,MsgType_
  287.     beq    cxp40
  288.  
  289.  
  290. * localisation de la fenetre :
  291.  
  292. * screen en a2 
  293.  
  294.     moveq    #0,d0
  295.     INT        LockIBase
  296.     move.l    d0,-(sp)
  297.  
  298.     movea.l    _IntuitionBase(a4),a0
  299.     movea.l    ib_FirstScreen(a0),a2
  300. cxp5    move.w    ib_MouseY(a0),d0        coord Y de la souris
  301.     cmp.w    sc_TopEdge(a2),d0        - haut de l'ecran
  302.     bge.s    cxp10
  303.     movea.l    sc_NextScreen(a2),a2
  304.     cmpa.w    #0,a2
  305.     bne.s    cxp5
  306.  
  307. cxp10    movea.l    (sp)+,a0
  308.     CALL        UnlockIBase
  309.  
  310.     movea.l    a2,a0
  311.     adda.w    #sc_LayerInfo,a0
  312.     move.l    a0,-(sp)
  313.     LAYER        LockLayerInfo
  314.  
  315.     movea.l    (sp),a0
  316.     move.w    sc_MouseX(a2),d0
  317.     move.w    sc_MouseY(a2),d1
  318.     CALL        WhichLayer
  319.     move.l    d0,d2                sauvegarde provisoire
  320.  
  321.     movea.l    (sp),a0
  322.     CALL        UnlockLayerInfo
  323.  
  324.     movea.l    (sp)+,a1            layerinfo en a1
  325.     move.l    d2,d0                restaure d0
  326.     beq    cxp1                si pas de layer, rien
  327.  
  328.     movea.l    d0,a0                layer en a0
  329.     movea.l    lr_Window(a0),a0        window en a0
  330.     cmpa.w    #NULL,a0
  331.     beq    cxp1    
  332.     move.l    wd_IDCMPFlags(a0),d0
  333.     andi.l    #IDCMP_CLOSEWINDOW,d0
  334.     beq    cxp1
  335.  
  336.     move.l    a0,_IDCMPWindow(a5)
  337.     movea.l    wd_UserPort(a0),a0
  338.     lea    cxp_Msg(a5),a1
  339.     EXEC        PutMsg
  340.  
  341.     bra    cxp1
  342.  
  343.  
  344. * on a recu un msg COMMAND :
  345.  
  346. cxp40    cmpi.w    #CXCMD_KILL,MsgId_        kill WClose
  347.     beq.s    cxp60
  348.  
  349.     cmpi.w    #CXCMD_UNIQUE,MsgId_        toggle WClose
  350.     beq.s    cxp60
  351.  
  352.     cmpi.w    #CXCMD_DISABLE,MsgId_        dormant WClose
  353.     bne.s    cxp43
  354.  
  355.     moveq    #FALSE,d0
  356.     bsr.s    SwitchBroker
  357.  
  358.     bra    cxp1
  359.  
  360. cxp43    cmpi.w    #CXCMD_ENABLE,MsgId_        wake up WClose
  361.     bne    cxp1
  362.  
  363.     moveq    #TRUE,d0
  364.     bsr.s    SwitchBroker
  365.  
  366.     bra    cxp1
  367.  
  368.  
  369. cxp55    moveq    #RETURN_ERROR,d2
  370.  
  371.     bra.s    cxp62
  372.  
  373. * Exit :
  374.  
  375. cxp60    moveq    #RETURN_OK,d2
  376.  
  377. cxp62    tst.l    Broker_
  378.     beq.s    cxp70
  379.  
  380. cxp65    movea.l    Broker_,a0
  381.     CX        DeleteCxObjAll
  382.  
  383. cxp70    movea.l    _DOSBase(a4),a1
  384.     EXEC    CloseLibrary
  385.  
  386. cxp94    movea.l    _IconBase(a4),a1
  387.     CALL        CloseLibrary
  388.  
  389. cxp93    movea.l    _LayerBase(a4),a1
  390.     CALL        CloseLibrary
  391.  
  392. cxp92    movea.l    _IntuitionBase(a4),a1
  393.     CALL        CloseLibrary
  394.  
  395. cxp91    movea.l    _CxBase(a4),a1
  396.     CALL        CloseLibrary
  397.  
  398. * restore la priorite du shell d'origine le cas echeant :
  399.  
  400. cxp90    move.l    d2,d0
  401.  
  402.     rts
  403.  
  404.  
  405. *****
  406. *    subroutines.
  407. *****
  408.  
  409. SwitchBroker:
  410.  
  411. * void SwitchBroker(BOOL)
  412. *             d0 = TRUE or FALSE
  413.  
  414.     movea.l    Broker_,a0
  415.     CX        ActivateCxObj
  416.  
  417.     rts
  418.  
  419.  
  420. cxp_Action:
  421.  
  422.     movea.l    _BSSBase+_CxBase,a6
  423.     jsr    _LVODisposeCxMsg(a6)
  424.  
  425.     rts
  426.  
  427.  
  428. *****
  429. *    version.
  430. *****
  431.  
  432.     dc.b    '$VER: WClose 1.00 (02.93)'
  433.  
  434.     cnop    0,2
  435.  
  436.  
  437. *****
  438. *    constantes du programme.
  439. *****
  440.  
  441.     SECTION        Constantes,DATA
  442.  
  443. _DataBase:
  444.  
  445.   LAB    cxp_NewBroker:
  446.         dc.b    NB_VERSION,0
  447.         dc.l    _DataBase+cxp_BkName
  448.         dc.l    _DataBase+cxp_BkTitle
  449.         dc.l    _DataBase+cxp_BkDescr
  450.         dc.w    NBU_UNIQUE+NBU_NOTIFY
  451.         dc.w    0
  452.     DAT    cxp_Pri
  453.         dc.b    0
  454.         dc.b    0
  455.     DAT    cxp_Port
  456.         dc.l    0
  457.         dc.w    0
  458.  
  459.  
  460.     LAB    IX
  461.         dc.b    IX_VERSION
  462.         dc.b    IECLASS_RAWMOUSE
  463.         dc.w    0
  464.         dc.w    IECODE_UP_PREFIX
  465.     DAT    cxp_Qual
  466.         dc.w    IEQUALIFIER_RBUTTON+IEQUALIFIER_LCOMMAND
  467.     DAT    cxp_QualMask
  468.         dc.w    CXP_QUALMASK
  469.         dc.w    0
  470.  
  471.  
  472.     LAB    cxp_Msg
  473.     dc.l    0,0            is_Node.ln_Succ, is_Node.ln_Pred
  474.     dc.b    NT_MESSAGE,0        is_Node.ln_Type, is_Node.ln_Pri
  475.     dc.l    0            is_Node.ln_Name
  476.  
  477.     dc.l    0            replyport
  478.     dc.w    $20            length
  479.  
  480.     dc.l    IDCMP_CLOSEWINDOW
  481.     dc.w    0
  482.     dc.w    0
  483.     dc.l    0
  484.     dc.w    0
  485.     dc.w    0
  486.     dc.l    0
  487.     dc.l    0
  488.     DAT    _IDCMPWindow
  489.     dc.l    0
  490.     dc.l    0
  491.  
  492.  
  493.     CHAR    cxname
  494.         CXNAME
  495.     CHAR    dosname
  496.         DOSNAME
  497.     CHAR    intname
  498.         INTNAME
  499.     CHAR    iconname
  500.         ICONNAME
  501.     CHAR    layername
  502.         dc.b    'layers.library',0
  503.     CHAR    cxp_HotKey
  504.     CHAR    cxp_BkName
  505.         dc.b    'WClose',0
  506.     CHAR    cxp_BkTitle
  507.         dc.b    'Close window if possible',0
  508.     CHAR    cxp_BkDescr
  509.         dc.b    'Key+Mousebutton=close window',0
  510.     CHAR    cxp_ToolType
  511.         dc.b    'CX_PRIORITY',0
  512.     CHAR    cxp_ToolType1
  513.         dc.b    'QUALIFIER',0
  514.     CHAR    cxp_ToolType2
  515.         dc.b    'MOUSEBUTTON',0
  516.  
  517.  
  518. *****
  519. *    variables du programme.
  520. *****
  521.  
  522.     SECTION        Variables,BSS
  523.  
  524.     rsreset
  525.  
  526. _CxBase        rs.l    1
  527. _IntuitionBase    rs.l    1
  528. _LayerBase    rs.l    1
  529. _IconBase    rs.l    1
  530. _DOSBase    rs.l    1
  531. cxp_Task    rs.l    1
  532. cxp_DiskObj    rs.l    1
  533. IX_dumm        rs.b    ix_SIZEOF
  534. Data_SizeOf    rs.l    0
  535.  
  536. _BSSBase:    ds.l    Data_SizeOf
  537.  
  538.     END
  539.  
  540.